1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.primitives;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkElementIndex;
21 import static com.google.common.base.Preconditions.checkNotNull;
22 import static com.google.common.base.Preconditions.checkPositionIndexes;
23 import static java.lang.Float.NEGATIVE_INFINITY;
24 import static java.lang.Float.POSITIVE_INFINITY;
25
26 import com.google.common.annotations.Beta;
27 import com.google.common.annotations.GwtCompatible;
28 import com.google.common.base.Converter;
29
30 import java.io.Serializable;
31 import java.util.AbstractList;
32 import java.util.Collection;
33 import java.util.Collections;
34 import java.util.Comparator;
35 import java.util.List;
36 import java.util.RandomAccess;
37
38
39
40
41
42
43
44
45
46
47
48
49 @GwtCompatible(emulated = true)
50 public final class Floats {
51 private Floats() {}
52
53
54
55
56
57
58
59 public static final int BYTES = Float.SIZE / Byte.SIZE;
60
61
62
63
64
65
66
67
68 public static int hashCode(float value) {
69
70 return ((Float) value).hashCode();
71 }
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 public static int compare(float a, float b) {
88 return Float.compare(a, b);
89 }
90
91
92
93
94
95
96
97
98 public static boolean isFinite(float value) {
99 return NEGATIVE_INFINITY < value & value < POSITIVE_INFINITY;
100 }
101
102
103
104
105
106
107
108
109
110
111
112 public static boolean contains(float[] array, float target) {
113 for (float value : array) {
114 if (value == target) {
115 return true;
116 }
117 }
118 return false;
119 }
120
121
122
123
124
125
126
127
128
129
130
131 public static int indexOf(float[] array, float target) {
132 return indexOf(array, target, 0, array.length);
133 }
134
135
136 private static int indexOf(
137 float[] array, float target, int start, int end) {
138 for (int i = start; i < end; i++) {
139 if (array[i] == target) {
140 return i;
141 }
142 }
143 return -1;
144 }
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 public static int indexOf(float[] array, float[] target) {
161 checkNotNull(array, "array");
162 checkNotNull(target, "target");
163 if (target.length == 0) {
164 return 0;
165 }
166
167 outer:
168 for (int i = 0; i < array.length - target.length + 1; i++) {
169 for (int j = 0; j < target.length; j++) {
170 if (array[i + j] != target[j]) {
171 continue outer;
172 }
173 }
174 return i;
175 }
176 return -1;
177 }
178
179
180
181
182
183
184
185
186
187
188
189 public static int lastIndexOf(float[] array, float target) {
190 return lastIndexOf(array, target, 0, array.length);
191 }
192
193
194 private static int lastIndexOf(
195 float[] array, float target, int start, int end) {
196 for (int i = end - 1; i >= start; i--) {
197 if (array[i] == target) {
198 return i;
199 }
200 }
201 return -1;
202 }
203
204
205
206
207
208
209
210
211
212
213 public static float min(float... array) {
214 checkArgument(array.length > 0);
215 float min = array[0];
216 for (int i = 1; i < array.length; i++) {
217 min = Math.min(min, array[i]);
218 }
219 return min;
220 }
221
222
223
224
225
226
227
228
229
230
231 public static float max(float... array) {
232 checkArgument(array.length > 0);
233 float max = array[0];
234 for (int i = 1; i < array.length; i++) {
235 max = Math.max(max, array[i]);
236 }
237 return max;
238 }
239
240
241
242
243
244
245
246
247
248
249 public static float[] concat(float[]... arrays) {
250 int length = 0;
251 for (float[] array : arrays) {
252 length += array.length;
253 }
254 float[] result = new float[length];
255 int pos = 0;
256 for (float[] array : arrays) {
257 System.arraycopy(array, 0, result, pos, array.length);
258 pos += array.length;
259 }
260 return result;
261 }
262
263 private static final class FloatConverter
264 extends Converter<String, Float> implements Serializable {
265 static final FloatConverter INSTANCE = new FloatConverter();
266
267 @Override
268 protected Float doForward(String value) {
269 return Float.valueOf(value);
270 }
271
272 @Override
273 protected String doBackward(Float value) {
274 return value.toString();
275 }
276
277 @Override
278 public String toString() {
279 return "Floats.stringConverter()";
280 }
281
282 private Object readResolve() {
283 return INSTANCE;
284 }
285 private static final long serialVersionUID = 1;
286 }
287
288
289
290
291
292
293
294 @Beta
295 public static Converter<String, Float> stringConverter() {
296 return FloatConverter.INSTANCE;
297 }
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315 public static float[] ensureCapacity(
316 float[] array, int minLength, int padding) {
317 checkArgument(minLength >= 0, "Invalid minLength: %s", minLength);
318 checkArgument(padding >= 0, "Invalid padding: %s", padding);
319 return (array.length < minLength)
320 ? copyOf(array, minLength + padding)
321 : array;
322 }
323
324
325 private static float[] copyOf(float[] original, int length) {
326 float[] copy = new float[length];
327 System.arraycopy(original, 0, copy, 0, Math.min(original.length, length));
328 return copy;
329 }
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345 public static String join(String separator, float... array) {
346 checkNotNull(separator);
347 if (array.length == 0) {
348 return "";
349 }
350
351
352 StringBuilder builder = new StringBuilder(array.length * 12);
353 builder.append(array[0]);
354 for (int i = 1; i < array.length; i++) {
355 builder.append(separator).append(array[i]);
356 }
357 return builder.toString();
358 }
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376 public static Comparator<float[]> lexicographicalComparator() {
377 return LexicographicalComparator.INSTANCE;
378 }
379
380 private enum LexicographicalComparator implements Comparator<float[]> {
381 INSTANCE;
382
383 @Override
384 public int compare(float[] left, float[] right) {
385 int minLength = Math.min(left.length, right.length);
386 for (int i = 0; i < minLength; i++) {
387 int result = Float.compare(left[i], right[i]);
388 if (result != 0) {
389 return result;
390 }
391 }
392 return left.length - right.length;
393 }
394 }
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411 public static float[] toArray(Collection<? extends Number> collection) {
412 if (collection instanceof FloatArrayAsList) {
413 return ((FloatArrayAsList) collection).toFloatArray();
414 }
415
416 Object[] boxedArray = collection.toArray();
417 int len = boxedArray.length;
418 float[] array = new float[len];
419 for (int i = 0; i < len; i++) {
420
421 array[i] = ((Number) checkNotNull(boxedArray[i])).floatValue();
422 }
423 return array;
424 }
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443 public static List<Float> asList(float... backingArray) {
444 if (backingArray.length == 0) {
445 return Collections.emptyList();
446 }
447 return new FloatArrayAsList(backingArray);
448 }
449
450 @GwtCompatible
451 private static class FloatArrayAsList extends AbstractList<Float>
452 implements RandomAccess, Serializable {
453 final float[] array;
454 final int start;
455 final int end;
456
457 FloatArrayAsList(float[] array) {
458 this(array, 0, array.length);
459 }
460
461 FloatArrayAsList(float[] array, int start, int end) {
462 this.array = array;
463 this.start = start;
464 this.end = end;
465 }
466
467 @Override public int size() {
468 return end - start;
469 }
470
471 @Override public boolean isEmpty() {
472 return false;
473 }
474
475 @Override public Float get(int index) {
476 checkElementIndex(index, size());
477 return array[start + index];
478 }
479
480 @Override public boolean contains(Object target) {
481
482 return (target instanceof Float)
483 && Floats.indexOf(array, (Float) target, start, end) != -1;
484 }
485
486 @Override public int indexOf(Object target) {
487
488 if (target instanceof Float) {
489 int i = Floats.indexOf(array, (Float) target, start, end);
490 if (i >= 0) {
491 return i - start;
492 }
493 }
494 return -1;
495 }
496
497 @Override public int lastIndexOf(Object target) {
498
499 if (target instanceof Float) {
500 int i = Floats.lastIndexOf(array, (Float) target, start, end);
501 if (i >= 0) {
502 return i - start;
503 }
504 }
505 return -1;
506 }
507
508 @Override public Float set(int index, Float element) {
509 checkElementIndex(index, size());
510 float oldValue = array[start + index];
511
512 array[start + index] = checkNotNull(element);
513 return oldValue;
514 }
515
516 @Override public List<Float> subList(int fromIndex, int toIndex) {
517 int size = size();
518 checkPositionIndexes(fromIndex, toIndex, size);
519 if (fromIndex == toIndex) {
520 return Collections.emptyList();
521 }
522 return new FloatArrayAsList(array, start + fromIndex, start + toIndex);
523 }
524
525 @Override public boolean equals(Object object) {
526 if (object == this) {
527 return true;
528 }
529 if (object instanceof FloatArrayAsList) {
530 FloatArrayAsList that = (FloatArrayAsList) object;
531 int size = size();
532 if (that.size() != size) {
533 return false;
534 }
535 for (int i = 0; i < size; i++) {
536 if (array[start + i] != that.array[that.start + i]) {
537 return false;
538 }
539 }
540 return true;
541 }
542 return super.equals(object);
543 }
544
545 @Override public int hashCode() {
546 int result = 1;
547 for (int i = start; i < end; i++) {
548 result = 31 * result + Floats.hashCode(array[i]);
549 }
550 return result;
551 }
552
553 @Override public String toString() {
554 StringBuilder builder = new StringBuilder(size() * 12);
555 builder.append('[').append(array[start]);
556 for (int i = start + 1; i < end; i++) {
557 builder.append(", ").append(array[i]);
558 }
559 return builder.append(']').toString();
560 }
561
562 float[] toFloatArray() {
563
564 int size = size();
565 float[] result = new float[size];
566 System.arraycopy(array, start, result, 0, size);
567 return result;
568 }
569
570 private static final long serialVersionUID = 0;
571 }
572 }